package _java8新特性._lambda;

import org.junit.Test;

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;

/**
 * 函数式编程和命令式编程：
 *      简单说，函数式编程考虑结果和目的，即在写代码时为写命令和行为
 *      函数式编程更注重函数性，不保存状态，类比数学中的函数
 *      命令式编程，则注重写过程，写每一条指令
 *      多使用 stream 函数式接口 即在实践函数式编程
 *      好处：可读性高，大数据量处理集合效率高(并行流)，消灭嵌套
 *
 * 函数式接口：如果一个接口里只有一个抽象方法，那么这个接口即为一个函数式接口
 * 函数式接口的实例：可以通过 lambda表达式、方法引用、或构造器引用 等三种方式创建
 *
 * 如果使用注解@FunctionalInterface，则编译器会校验是否满足函数式接口的条件
 * 如果一个接口里只有一个抽象方法，但是没有使用注解@FunctionalInterface，则编译器还是回将其看做函数式接口
 *
 * lambda 写法： ()  ->  {}
 *      小括号里写参数列表
 *      箭头为固定写法
 *      花括号里写多个处理语句
 *      注：如果 参数 或 处理语句 只有一个，则可以省略括号
 *
 *
 *
 */
public class Demo_01 {

    @Test
    public void test_01() {
        // 匿名类 写法
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("新线程");
            }
        }).start();

        // lambda 替代 匿名类
        new Thread(() -> System.out.println("新线程")).start();

        // 注意，可不用声明类型，Java 编译器可以自己推断，如果不能推断则需要定义
    }

    @Test
    public void test_02() {
        // 遍历
        List<Integer> list = Arrays.asList(1,2,3);

        // 传统的遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
        // 增强for
        for (Integer integer : list) {
            System.out.println(integer);
        }

        // forEach 匿名类作为参数
        list.forEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) {
                System.out.println(integer);
            }
        });
        // forEach lambda表达式作为参数
        list.forEach((Integer integer) -> System.out.println(integer));
        // Integer 可以自动推断，所以可以省略，直接写参数名
        list.forEach(integer -> System.out.println(integer));
    }

}
/**
 * https://www.bilibili.com/video/BV18T4y1G7ME?p=3&spm_id_from=pageDriver&vd_source=6bb9b3dca1c3c3566f9e34799c161ae6
 * https://www.bilibili.com/video/BV1Gh41187uR?p=3&vd_source=6bb9b3dca1c3c3566f9e34799c161ae6
 *
 */